package com.xinchuang.service;

import com.xinchuang.entity.targetSystem.FontTable;
import com.xinchuang.entity.targetSystem.system.SystemPosition;
import com.xinchuang.entity.targetSystem.system.SystemsMaster;
import com.xinchuang.entity.targetSystem.system.SystemsRelation;
import com.xinchuang.entity.targetSystem.target.TargetMsgTable;
import com.xinchuang.entity.targetSystem.target.TargetPostureMsgTable;
import com.xinchuang.entity.targetSystem.target.TargetSubMsgTable;
import com.xinchuang.util.RedisUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * TODO
 *
 * @author zkwczx
 * @version 1.0
 * @date 2024/4/11 8:22
 */
public interface RedisUseService {

    //TODO: 目标缓存

    /**
     * 初始化目标
     */
    void initTarget();

    /**
     * 判断是否为目标
     * @param id
     * @return
     */
    boolean isTarget(String id);

    /**
     * 更新目标
     */
    void updateIsTarget(String id);

    /**
     * 初始化子目标
     */
    void initSub();

    /**
     * 判断是否为子目标
     * @param id
     * @return
     */
    boolean isSub(String id);

    /**
     * 更新目标
     */
    void updateIsSub(String id);

    //TODO: 类型缓存操作 START

    /**
     * 初始化类型图标
     */
    void initTypeSign();

    /**
     * 初始化类型名称
     */
    void initTypeName();

    /**
     * 修改类型图标缓存
     * @param typeId
     * @param sign
     */
    void updateTypeSign(String typeId, String sign);

    /**
     * 获取类型图标
     * @param typeId
     */
    String getTypeSign(String typeId);

    /**
     * 修改类型名称缓存
     * @param typeId
     * @param typeName
     */
    void updateTypeName(String typeId, String typeName);

    /**
     * 获取类型名称
     * @param typeId
     * @return
     */
    String getTypeName(String typeId);

    /**
     * 修改子目标类型名称缓存
     * @param typeId
     * @param typeName
     */
    void updateSubTypeName(String typeId, String typeName);

    /**
     * 获取子目标类型名称
     * @param typeId
     * @return
     */
    String getSubTypeName(String typeId);

    /**
     * 修改态势类型名称缓存
     * @param typeId
     * @param typeName
     */
    void updatePostureTypeName(String typeId, String typeName);

    /**
     * 获取态势类型名称
     * @param typeId
     * @return
     */
    String getPostureTypeName(String typeId);

    //TODO: 类型图标缓存操作 END

    //TODO:目标基础参数初始化 START

    /**
     * 目标初始化
     */
    void initTargetBase();

    /**
     * 目标信息更新
     * @param targetId
     * @param msgTables
     */
    void updateTargetBase(String targetId, List<TargetMsgTable> msgTables);

    /**
     * 目标信息更新
     * @param targetId
     * @param msgTables
     */
    void updateTargetSpecial(String targetId, List<TargetMsgTable> msgTables);

    /**
     * 目标的子目标关联缓存
     */
    void initTargetSubRelation();

    /**
     * 更新目标与子目标的关联缓存
     * @param isAdd
     * @param targetId
     * @param subId
     */
    void updateTargetSubRelation(boolean isAdd, String targetId, String subId);

    /**
     * 获取目标类型名称或ID
     * @param targetId
     * @param isName
     * @return
     */
    String getTargetTypeIdOrName(String targetId, boolean isName);

    //TODO:目标基础参数初始化 END

    //TODO:子目标基础参数初始化 START

    /**
     * 子目标初始化
     */
    void initSubBase();

    /**
     * 子目标信息更新
     * @param subId
     * @param msgTables
     */
    void updateSubBase(String subId, List<TargetSubMsgTable> msgTables);

    /**
     * 子目标信息更新
     * @param subId
     * @param msgTables
     */
    void updateSubSpecial(String subId, List<TargetSubMsgTable> msgTables);

    //TODO:子目标基础参数初始化 END

    //TODO:态势参数初始化 START

    /**
     * 初始化态势数据
     */
    void initPostureData();

    /**
     * 更新态势数据
     * @param postureId
     * @param msgTables
     */
    void updatePostureBase(String postureId, List<TargetPostureMsgTable> msgTables);

    /**
     * 初始化态势关联关系
     */
    void initPostureRelation();

    /**
     * 更新态势关联关系
     * @param redId
     * @param postureId
     */
    void updatePostureRelation(String redId, String postureId);

    //TODO:态势参数初始化 END

    //TODO: 场景数据参数初始化 START

    /**
     * 初始化场景
     */
    void initView();

    /**
     * 更新场景
     * @param systemPosition
     */
    void updateView(SystemPosition systemPosition);

    //TODO: 场景数据参数初始化 END

    //TODO: 删除缓存相关操作

    /**
     * 删除目标相关缓存
     * @param targetId
     */
    void deleteTargetRedisData(String targetId);

    /**
     * 删除子目标相关缓存
     * @param subId
     */
    void deleteSubRedisData(String subId);

    /**
     * 删除场景缓存
     * @param viewId
     */
    void deleteView(String viewId);

    /**
     * 删除目标类型
     * @param typeId
     */
    void deleteTypeName(String typeId);

    /**
     * 删除目标类型
     * @param typeId
     */
    void deleteSubTypeName(String typeId);

    /**
     * 删除目标类型
     * @param typeId
     */
    void deletePostureTypeName(String typeId);

    /**
     * 删除类型图片缓存
     * @param typeId
     */
    void deleteSign(String typeId);

    /**
     * 删除态势关联
     * @param redId
     * @param postureId
     * @param isAll
     */
    void deletePosture(String redId, String postureId, boolean isAll);

    //TODO: 缓存数据封装

    /**
     * 目标缓存数据
     * @param targetId
     * @param type
     * @return
     */
    Map<String, Object> getTargetMapRedisData(String targetId, String type);

    /**
     * 子目标缓存数据
     * @param subId
     * @return
     */
    Map<String, Object> getSubMapRedisData(String subId);

    /**
     * 态势缓存数据
     * @param subId
     * @return
     */
    Map<String, Object> getPostureMapRedisData(String subId);

    /**
     * 子目标缓存数据
     * @param subId
     * @return
     */
    Map<String, Object> getSubBaseData(String subId);

    /**
     * 态势目标缓存数据
     * @param postureId
     * @return
     */
    Map<String, Object> getPostureBaseData(String postureId);

    /**
     * 获取场景数据
     * @param id
     * @param map
     * @param isTarget
     */
    void getViewData(Map<String, Object> map, String id, boolean isTarget);

    /**
     * 获取场景中的经纬度
     * @param id
     */
    List<Double> getViewPosition(String id);

    /**
     * 获取场景中的经纬度转弧度
     * @param id
     * @return
     */
    List<Double> getViewPositionRad(String id);

    /**
     * 获取目标的类型名称与图标
     * @param id
     * @param type 1 目标 2 子目标 3态势
     */
    void getTypeNameAndIcon(String id, int type, Map<String, Object> map);

    //TODO: 目标详细数据统计缓存

    //TODO: 体系关联的目标

    /**
     * 初始化体系目标列表
     */
    void initSystemsTargetList();

    /**
     * 更新体系目标列表
     * @param sysId
     * @param list
     */
    void updateSystemsTarget(String sysId, List<SystemsRelation> list);

    /**
     * 查询体系目标列表
     * @param sysId
     * @return
     */
    List<String> getSystemsTargetList(String sysId);

    /**
     * 删除目标列表
     * @param sysId
     */
    void deleteSystemsTargetList(String sysId);

    /**
     * 更新体系下级系统
     * @param sysId
     * @param systemsMaster
     */
    void updateSystemsRelation(String sysId, SystemsMaster systemsMaster);

    /**
     * 获取体系下级系统
     * @param sysId
     * @return
     */
    Map<Object, Object> getSystemsRelation(String sysId);

    /**
     * 删除体系下级系统
     * @param sysId
     * @param redId
     */
    void deleteSystemsRelation(String sysId, String redId);

    /**
     * 删除体系下级系统
     * @param sysId
     */
    void deleteSystemsRelationAll(String sysId);

    /**
     * 初始化体系目标的作用范围
     */
    void initSystemsRelationRangeValue();

    /**
     * 更新体系目标的作用范围
     * @param sysId
     * @param targetId
     * @param systemsRangeType
     */
    void updateSystemsRelationRangeValue(String sysId, String targetId, String rangeTypeId, String systemsRangeType);

    /**
     * 更新目标的作用范围
     * @param targetId
     * @param targetRangeType
     */
    void updateTargetRangeValue(String targetId, String targetRangeType);

    /**
     * 获取体系目标的作用范围
     * @param sysId
     * @param targetId
     * @return
     */
    void getSystemsRelationRangeValue(String sysId, String targetId, Map<String, Object> map);

    /**
     * 获取目标的作用范围
     * @param targetId
     * @return
     */
    void getTargetRangeValue(String targetId, Map<String, Object> map);

    /**
     * 删除体系目标的作用范围
     * @param sysId
     * @param targetId
     * @param isAll
     */
    void deleteSystemsRelationRangeValue(String sysId, String targetId, boolean isAll);

    /**
     * 删除目标的作用范围
     * @param targetId
     * @param isAll
     */
    void deleteTargetRangeValue(String targetId, boolean isAll);

    //作用范围类型

    /**
     * 初始化作用范围类型
     */
    void initRangeType();

    /**
     * 更新作用范围类型
     * @param rangeId
     * @param rangeType
     */
    void updateRangeType(String rangeId, String rangeType);

    /**
     * 删除作用范围类型
     * @param rangeId
     */
    void deleteRangeType(String rangeId);

    //目标手段

    /**
     * 更新目标手段
     * @param targetId
     * @param means
     */
    void updateTargetMeans(String targetId, String means);

    /**
     * 获取目标手段
     * @param targetId
     * @return
     */
    String getTargetMeans(String targetId);

    /**
     * 新增体系场景
     * @param id
     * @param scene
     */
    void addSystemsScene(String id, String scene);

    /**
     * 获取体系场景
     * @param id
     * @param map
     */
    void getSystemsScene(String id, Map<String, Object> map);

    /**
     * 获取体系集合所有目标
     * @param sysId
     * @return
     */
    Set<String> selectSystemsTargetIds(String sysId);

    /**
     *@author zhangxuan
     *@Description TODO 保存指标
     *@Date 16:57 2024/5/13
     *@Param [id, level, value]
     *@return void
     **/
    void addIndexLevelValue(String id, String level, String name, double value);

    /**
     *@author zhangxuan
     *@Description TODO 获取指标
     *@Date 16:58 2024/5/13
     *@Param [id, level, name]
     *@return double
     **/
    double getIndexLevelValue(String id, String level, String name);

    /**
     *@author zhangxuan
     *@Description TODO 删除指标
     *@Date 17:19 2024/5/13
     *@Param [id, level]
     *@return void
     **/
    void deleteIndexLevelValue(String id, String level, String name);

    /**
     * 体系设置
     * @param name
     * @param data
     */
    void updateFont(String name, String data);

    /**
     * 获取体系设置
     * @param name
     * @return
     */
    FontTable getFont(String name);

    /**
     * 获取用户ID
     * @param id
     * @return
     */
    String getUserId(String id);

}
